home *** CD-ROM | disk | FTP | other *** search
- (*******************************************************************
-
- MDEF.pas
-
- Scrolling MDEF for Transfer DA.
-
- (c) 1988, 1989, by Clifford Story & Attic Software
-
- *******************************************************************)
-
- unit MDEF;
-
- (******************************************************************)
-
- interface
-
- (******************************************************************)
-
- uses macintf, Common;
-
- (******************************************************************)
-
- procedure menudef(message : integer; themenu : menuhandle;
- static menurect : rect; hitpoint : point;
- var whichitem : integer);
-
- (******************************************************************)
-
- implementation
-
- (******************************************************************)
-
- const
-
- scrolldelay = 6;
- fixedlist = 7;
-
- (******************************************************************)
-
- procedure menudraw(themenu : menuhandle; static menurect : rect); forward;
- procedure menuchoose(themenu : menuhandle; static menurect : rect;
- hitpoint : point; var theitem : integer); forward;
- procedure menusize(themenu : menuhandle); forward;
-
- (******************************************************************)
-
- function gethandle : thandle; external;
- procedure sethandle(newhandle : point); external;
-
- function getoffset : integer; external;
- procedure setoffset(newoffset : integer); external;
-
- function getsize : integer; external;
- procedure setsize(newsize : integer); external;
-
- function getlength : integer; external;
- procedure setlength(newlength : integer); external;
-
- function getflags : integer; external;
- procedure setflags(newflags : integer); external;
-
- (******************************************************************)
-
- procedure menudef(message : integer; themenu : menuhandle;
- static menurect : rect; hitpoint : point;
- var whichitem : integer);
-
- begin
-
- case message of
- mdrawmsg : menudraw(themenu, menurect);
- mchoosemsg : menuchoose(themenu, menurect,
- hitpoint, whichitem);
- msizemsg : menusize(themenu);
- msethandle : sethandle(hitpoint);
- end;
-
- end;
-
- (******************************************************************)
-
- procedure drawitem(themenu : menuhandle;
- theitem : integer; static itemrect: rect);
-
- var
- height : integer;
- width : integer;
- thestring : str255;
- thepoly : polyhandle;
- dummy : integer;
-
- begin
-
- height := itemrect.top + 12;
- width := itemrect.left + 12;
-
- if theitem > fixedlist then begin
- with gethandle^^.appl[theitem - fixedlist] do
- blockmove(@name, @thestring, 32);
- moveto(width, height);
- drawstring(thestring);
- end else if theitem < 0 then begin
-
- thepoly := openpoly;
-
- if theitem = - 1 then begin
- moveto(width, height);
- dummy := - 6;
- end else if theitem = - 2 then begin
- moveto(width, height - 8);
- dummy := 6;
- end;
-
- line(6, dummy);
- line(6, - dummy);
- line(- 12, 0);
-
- closepoly;
- paintpoly(thepoly);
- killpoly(thepoly);
-
- end else begin
-
- getitem(themenu, theitem, thestring);
-
- if thestring = '-' then begin
- moveto(itemrect.left, height);
- lineto(itemrect.right, height);
- end else begin
- moveto(width, height);
- drawstring(thestring);
- end;
-
- if (theitem = 5) and (getsize <= fixedlist) then begin
- penpat(QDglobals^.gray);
- penmode(patbic);
- paintrect(itemrect);
- pennormal;
- end;
-
- end;
-
- end;
-
- (******************************************************************)
-
- procedure menudraw(themenu: menuhandle; static menurect: rect);
-
- var
- itemrect : rect;
- index : integer;
-
- begin
-
- with menurect do
- setrect(itemrect, left, top, right, top + 16);
- index := 1;
-
- while itemrect.bottom < menurect.bottom do begin
- drawitem(themenu, index, itemrect);
- itemrect.top := itemrect.bottom;
- itemrect.bottom := itemrect.bottom + 16;
- index := index + 1;
- end;
-
- if getsize > index then begin
- drawitem(themenu, - 2, itemrect);
- setflags(2);
- end else begin
- drawitem(themenu, index, itemrect);
- setflags(0);
- end;
-
- setoffset(0);
-
- end;
-
- (******************************************************************)
-
- procedure scrollmenu(themenu : menuhandle;
- static menurect : rect; direction : integer);
-
- var
- thetime : long;
- therect : rect;
- theregion : rgnhandle;
-
- begin
-
- thetime := tickcount + scrolldelay;
-
- therect.left := menurect.left;
- therect.right := menurect.right;
- theregion := newrgn;
-
- if direction > 0 then begin
-
- if getflags = 1 then begin
- therect.top := menurect.bottom - 16;
- therect.bottom := menurect.bottom;
- eraserect(therect);
- drawitem(themenu, - 2, therect);
- end;
-
- therect.top := menurect.top + 16 * (fixedlist + 1);
- therect.bottom := menurect.bottom - 16;
- scrollrect(therect, 0, 16, theregion);
-
- therect := theregion^^.rgnbbox;
- disposergn(theregion);
- setoffset(getoffset - 1);
-
- drawitem(themenu, getoffset + fixedlist + 2, therect);
- if getoffset <> 0 then
- setflags(3)
- else begin
- therect.top := menurect.top + 16 * fixedlist;
- therect.bottom := therect.top + 16;
- eraserect(therect);
- drawitem(themenu, fixedlist + 1, therect);
- setflags(2);
- end;
-
- end else begin
-
- if getflags = 2 then begin
- therect.top := menurect.top + 16 * fixedlist;
- therect.bottom := therect.top + 16;
- eraserect(therect);
- drawitem(themenu, - 1, therect);
- end;
-
- therect.top := menurect.top + 16 * (fixedlist + 1);
- therect.bottom := menurect.bottom - 16;
- scrollrect(therect, 0, - 16, theregion);
-
- therect := theregion^^.rgnbbox;
- disposergn(theregion);
- setoffset(getoffset + 1);
-
- drawitem(themenu, getoffset + getlength - 1, therect);
-
- if getoffset + getlength <> getsize then
- setflags(3)
- else begin
- therect.top := menurect.bottom - 16;
- therect.bottom := menurect.bottom;
- eraserect(therect);
- drawitem(themenu, getsize, therect);
- setflags(1);
- end;
-
- end;
-
- repeat until tickcount >= thetime;
-
- end;
-
- (******************************************************************)
-
- procedure menuchoose(themenu : menuhandle; static menurect : rect;
- hitpoint : point; var theitem : integer);
-
- var
- newitem : integer;
- therect : rect;
-
- begin
-
- if (hitpoint.v < menurect.top)
- or (hitpoint.h < menurect.left)
- or (hitpoint.h > menurect.right) then
- newitem := 0
- else begin
-
- newitem := (16 + hitpoint.v - menurect.top) div 16;
-
- if (newitem > getlength) and (getflags div 2 = 0) then
- newitem := 0
- else if (newitem >= getlength) and (getflags div 2 = 1) then begin
- scrollmenu(themenu, menurect, - 1);
- newitem := 0;
- end else if (newitem = fixedlist + 1) and (getflags mod 2 = 1) then begin
- scrollmenu(themenu, menurect, 1);
- newitem := 0;
- end;
-
- if newitem > fixedlist then
- newitem := newitem + getoffset;
-
- if (newitem = 3) or (newitem = 6) then
- newitem := 0
- else if (newitem = 5) and (getsize = fixedlist) then
- newitem := 0;
-
- end;
-
- if newitem <> theitem then begin
-
- therect.left := menurect.left;
- therect.right := menurect.right;
-
- if theitem > 0 then begin
- therect.bottom := menurect.top + 16 * theitem;
- if theitem > fixedlist then
- therect.bottom := therect.bottom - 16 * getoffset;
- therect.top := therect.bottom - 16;
- invertrect(therect);
- end;
-
- if newitem > 0 then begin
- therect.bottom := menurect.top + 16 * newitem;
- if newitem > fixedlist then
- therect.bottom := therect.bottom - 16 * getoffset;
- therect.top := therect.bottom - 16;
- invertrect(therect);
- end;
-
- end;
-
- theitem := newitem;
-
- end;
-
- (******************************************************************)
-
- function itemsize(themenu : menuhandle;
- theitem : integer) : integer;
-
- var
- thestring : str255;
-
- begin
-
- if theitem <= fixedlist then
- getitem(themenu, theitem, thestring)
- else with gethandle^^.appl[theitem - fixedlist] do
- blockmove(@name, @thestring, 32);
- itemsize := stringwidth(thestring);
-
- end;
-
- (******************************************************************)
-
- procedure menusize(themenu : menuhandle);
-
- var
- savedload : logical;
- savedfont : integer;
- savedsize : integer;
- savedface : style;
- thewidth : integer;
- thecount : integer;
- index : integer;
- newwidth : integer;
- maxheight : integer;
-
- begin
-
- savedload := logical(ptr(resload)^);
- setresload(true);
-
- with QDglobals^.theport^ do begin
- savedfont := txfont;
- savedsize := txsize;
- savedface := txface;
- end;
-
- textfont(systemfont);
- textsize(12);
- textface([]);
-
- thewidth := 0;
- thecount := gethandle^^.count + fixedlist;
-
- for index := 1 to thecount do begin
- newwidth := itemsize(themenu, index);
- if newwidth > thewidth then
- thewidth := newwidth;
- end;
-
- if bittst(ptr(rom85), 0) then
- maxheight := 320
- else with QDglobals^.screenbits.bounds do
- maxheight := bottom - top - shortpointer(mbarheight)^;
-
- with themenu^^ do begin
-
- menuheight := 16 * thecount;
-
- if bittst(ptr(rom85), 0) then
- maxheight := 304
- else with QDglobals^.screenbits.bounds do
- maxheight := bottom - top - 16
- - shortpointer(mbarheight)^;
-
- if menuheight > maxheight then
- menuheight := maxheight - (maxheight mod 16);
-
- menuwidth := thewidth + 16;
-
- setsize(thecount);
- setlength(menuheight div 16);
-
- end;
-
- textface(savedface);
- textsize(savedsize);
- textfont(savedfont);
-
- setresload(savedload);
-
- end;
-
- (******************************************************************)
-
- end.
-
- (******************************************************************)
-